package Leetcode.数组字符串;

import java.util.Arrays;

/**
 * @ClassName 确定两个字符串是否接近
 * @since: 2023/8/12 10:12
 * @auth: kirito
 * @description:
 * 如果可以使用以下操作从一个字符串得到另一个字符串，则认为两个字符串 接近 ：
 *
 * 操作 1：交换任意两个 现有 字符。
 * 例如，abcde -> aecdb
 * 操作 2：将一个 现有 字符的每次出现转换为另一个 现有 字符，并对另一个字符执行相同的操作。
 * 例如，aacabb -> bbcbaa（所有 a 转化为 b ，而所有的 b 转换为 a ）
 * 你可以根据需要对任意一个字符串多次使用这两种操作。
 *
 * 给你两个字符串，word1 和 word2 。如果 word1 和 word2 接近 ，就返回 true ；否则，返回 false 。
 *
 * 说人话就是----------------------------
 * 两类操作都不会凭空产生或删除字符，而仅仅是对字符进行互换。
 *
 * 由于操作 1 和 2 都不限次数，因此我们只需检查「字符种类是否相同」和「字符频次是否相等」，即可得出两字符串是否接近的结论。
 *
 * 具体的，由于 s1 和 s2 都仅包含小写字母，因此可以创建两个大小为 26 的
 * 数组 c1 和 c2 分别对两字符串进行词频统计。
 *
 * 随后进行合法性检查：
 *
 * 字符种类是否相同：若存在某个字符仅在 s1 或 s2 中出现过，两字符串必不接近，返回 False
 * 字符频次是否相等：对 c1 和 c2 进行排序，并逐项检查，若存在 c1[i] != c2[i]，
 * 说明存在词频为 c1[i] 的字符种类数在 s1 和 s2 间并不相等，返回 False
 * 若上述两项检查无误，说明两字符串接近，返回 True。
 *
 **/
public class 确定两个字符串是否接近 {
    /**
     * 判断两个字符串是否是“近似字符串”。
     * 两个字符串是“近似字符串”，如果它们具有以下属性：
     * 1. 字符频次相同：两个字符串中的字符出现的次数相同。
     * 2. 字符种类相同：两个字符串中的字符种类相同（不考虑字符顺序）。
     *
     * @param s1 第一个字符串
     * @param s2 第二个字符串
     * @return 若两个字符串是“近似字符串”，则返回 true；否则返回 false。
     */
    public boolean closeStrings(String s1, String s2) {
        int[] c1 = new int[26]; // 用于存储第一个字符串中各字符的频次
        int[] c2 = new int[26]; // 用于存储第二个字符串中各字符的频次

        // 计算第一个字符串中各字符的频次
        for (char c : s1.toCharArray()) {
            c1[c - 'a']++;
        }

        // 计算第二个字符串中各字符的频次
        for (char c : s2.toCharArray()) {
            c2[c - 'a']++;
        }

        // 检查字符频次是否相同，以及字符种类是否相同
        for (int i = 0; i < 26; i++) {
            if (c1[i] + c2[i] == 0) {
                continue;
            }
            if (c1[i] == 0 || c2[i] == 0) {
                return false;
            }
        }

        // 对频次数组进行排序，以便比较字符种类是否相同
        Arrays.sort(c1);
        Arrays.sort(c2);

        // 检查字符频次数组是否相同
        for (int i = 0; i < 26; i++) {
            if (c1[i] != c2[i]) {
                return false;
            }
        }

        return true; // 两个字符串是“近似字符串”
    }

}
